// G4提供的头文件
#include "G4RunManager.hh"
#include "G4Event.hh"
#include "G4AnalysisManager.hh"
// 用户编写的头文件
#include "G4ImproveEventAction.hh"
#include "G4ImproveRunAction.hh"

// 构造函数，参数为runAction
G4ImproveEventAction::G4ImproveEventAction(G4ImproveRunAction* runAction)
: fRunAction(runAction){

    // 打开文件
    outFile.open("../out/out.txt", std::ios::out | std::ios::trunc);
    if (!outFile.is_open()) {
        G4cerr << "Error opening file: out.txt" << G4endl;
    }
}

// 析构函数
G4ImproveEventAction::~G4ImproveEventAction(){
    // 关闭文件
    if (outFile.is_open()) {
        outFile.close();
    }
}

// 此函数每个event开始前运行
void G4ImproveEventAction::BeginOfEventAction(const G4Event*){

    // 获取事件ID
    eventID = G4EventManager::GetEventManager()->GetNonconstCurrentEvent()->GetEventID();
    // 打印事件ID
    G4cout << "--------------------eventID:" << eventID << "-----------------------";

    fEdep = 0.0;                    // 每个event开始前，将上个event能量沉积置零
}

// 此函数每个event结束后运行一次
void G4ImproveEventAction::EndOfEventAction(const G4Event*){
   
    fRunAction->AddEdep(fEdep);     // 每个event结束后，将本次event能量沉积值交给runAction

    if (outFile.is_open())
        outFile << fEdep << G4endl;  // 将每个事件的能量沉积写入文件

    // 以.root的格式保存
    auto analysisManager = G4AnalysisManager::Instance();
    analysisManager->FillH1(1, fEdep);      // 将本次event的能量沉积添加到直方图中

    G4cout << G4endl;               // 打印换行
}

// 在steppingAction中运行，累加每个step的能量沉积
void G4ImproveEventAction::AddEdep(G4double edep){
    
    fEdep += edep;                  // 累加step中沉积的能量
}
